Hippo4j 原理简单解读 | 您所在的位置:网站首页 › blastbufferqueue 原理解读 › Hippo4j 原理简单解读 |
前言:
对于java系统性能调优,大家的关注点很多都集中在jvm内存、cpu、连接等,只有一部分会关注到系统中真正干活的线程,这些线程好比一个公司的职员。公司各个部门的人员配比如何?以及这些人员是忙着呢,还是闲着呢? 对于流量较大或者任务型的系统,必须确保线程有合适的配比。Hippo4j就是解决这样问题的平台。 原理篇 1)线程池线程池化是目前线程管理事实上的标准,Hippo4j管理线程事实上是管理不同的线程池。 线程池能被管理吗?或者说线程池能被监控、统计以及动态调整吗?答案是肯定的。 下面罗列ThreadPoolExecutor类部分api: 核心线程 setCorePoolSizegetCorePoolSize最大线程 setMaximumPoolSizegetMaximumPoolSize阻塞队列 getQueue存活的线程 getActiveCount获取线程堆栈信息 ThreadPoolExecuto.workers 2)如何获取到这些线程呢?Hippo4j是基于spring框架开发的。不同的第三方组件依赖线程池的方式不同,Hippo4j需要做的就是在项目启动的过程中,挨个适配捕获不同组件依赖的线程池。然后将他们注册到服务端进行管理起来。下面我们看一个
ApplicationStartedEvent是spring2.0的消息,也就是如果要对接hippo4j 1.5那么就需要依赖spring boot2.0,此消息是spring 容器已经刷新完毕但是业务流量还没进来。 由于spring 容器已经刷新完毕,因此可以通过spring容器获取已经实例化后的目标类 ApplicationContextHolder.getBeansOfType(DefaultRocketMQListenerContainer.class) 然后通过反射ReflectUtil就可以获得到线程池了,进而就可以组件依赖的控制线程了。 3)Hippo4j 客户端如何与服务端交互?Hippo4j客户端与服务通信,参考nacos实现的长轮询。 轮询是指不管服务端数据有无更新,客户端每隔定长时间请求拉取一次数据,可能有更新数据返回,也可能什么都没有。 长轮询客户端发起长轮询,如果服务端的数据没有发生变更,会 hold 住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。返回后,客户端又会立即再次发起下一次长轮询。 |
CopyRight 2018-2019 实验室设备网 版权所有 |